home *** CD-ROM | disk | FTP | other *** search
/ Amiga Game-Power / Amiga Game-Power.iso / anwendungen / disk salv / memtrace / mem.c < prev    next >
C/C++ Source or Header  |  1994-05-20  |  2KB  |  144 lines

  1. /*
  2.  * mem.c - This file contains the routines which trace memory allocations
  3.  * (c)1988 Jojo Wesener
  4.  */
  5.  
  6. #include <stdio.h>
  7. /*
  8.  * use FreeMem() and AllocMem() as usual and then call freeall()
  9.  * when your program exits.
  10.  */
  11.  
  12. #ifdef MEMTRACE
  13.  
  14. struct membkt {
  15.     char * addr;
  16.     long amt;
  17.     long type;
  18.     char * func, * file;
  19.     long line;
  20.     struct membkt * next;
  21. };
  22.  
  23. typedef struct membkt membkt_t;
  24.  
  25. membkt_t * Mem_list = NULL;
  26.  
  27. char * malloc();
  28.  
  29. membkt_t *
  30. get_bkt()
  31. {
  32.     return (membkt_t *)malloc(sizeof(membkt_t));
  33. }
  34.  
  35. put_bkt(bkt)
  36.     membkt_t *bkt;
  37. {
  38.     free( (char *)bkt );
  39. }
  40.  
  41. membkt_t *
  42. find_bkt(addr)
  43.     char * addr;
  44. {
  45.     membkt_t * bkt, *pre;
  46.  
  47.     bkt = Mem_list;
  48.  
  49.     for( ; bkt != NULL ; bkt = bkt->next )
  50.         if( bkt->addr == addr )
  51.             break;
  52.  
  53.     if( bkt == NULL )
  54.         return NULL;
  55.  
  56.     /* remove it from the list */
  57.     if( bkt == Mem_list ) {
  58.         Mem_list = Mem_list->next;
  59.         return bkt;
  60.     }
  61.  
  62.     for( pre = Mem_list ; pre->next != bkt ; pre = pre->next );
  63.  
  64.     pre->next = bkt->next;
  65.  
  66.     return bkt;
  67. }
  68.  
  69. store_bkt( bkt )
  70.     membkt_t *bkt;
  71. {
  72.     bkt->next = Mem_list;
  73.     Mem_list = bkt;
  74. }
  75.  
  76. char *
  77. alloctrack(amt,type,file,func,line)
  78.     long amt;
  79.     long type;
  80.     char * file, * func;
  81.     long line;
  82. {
  83.     char * mem;
  84.     membkt_t * bkt;
  85.  
  86.     mem = (char *)AllocMem(amt,type);
  87.  
  88.     if( mem  == NULL )
  89.         return mem;
  90.  
  91.     if( (bkt = get_bkt()) == NULL ) {
  92.         printf("alloctrack: unable to alloc bucket\n");
  93.         exit( 1 );
  94.     }
  95.  
  96.     bkt->addr = mem;
  97.     bkt->amt = amt;
  98.     bkt->type = type;
  99.     bkt->file = file;
  100.     bkt->func = func;
  101.     bkt->line = line;
  102.  
  103.     store_bkt( bkt );
  104.  
  105.     return mem;
  106. }
  107.  
  108. freetrack(addr,amt,file,func,line)
  109.     char * addr;
  110.     long amt;
  111.     char * file, * func, * line;
  112. {
  113.     membkt_t * bkt;
  114.  
  115.     if( (bkt = find_bkt( addr )) == NULL ) {
  116.         printf("freetrack: error %s, %s, %d, 0x%x -- 0x%x\n",file,func,line,
  117.             addr,amt);
  118.         return;
  119.     }
  120.  
  121.     (void)FreeMem(addr,amt);
  122.  
  123.     put_bkt(bkt);
  124. }
  125.  
  126. freeall()
  127. {
  128.     membkt_t *bkt;
  129.  
  130.     printf("freeall:\n");
  131.     for( bkt = Mem_list; bkt != NULL ; bkt = bkt->next ) {
  132.         (void)FreeMem(bkt->addr, bkt->amt);
  133.         printf("\t%s, %s, %d, 0x%x --0x%x --0x%x\n",bkt->file,bkt->func,
  134.             bkt->line, bkt->addr, bkt->amt, bkt->type);
  135.         put_bkt( bkt );
  136.     }
  137.     printf("end freeall\n");
  138. }
  139. #endif MEMTRACE
  140.  
  141. /* Lint Output
  142. mem.c:
  143. */
  144.